home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / inst30.m < prev    next >
Text File  |  1997-10-26  |  17KB  |  556 lines

  1. MODULE Inst30;
  2.  
  3. (*$R-, S-, P+, M- *) 
  4.  
  5. (* Modul:               DB-Conv                                 *)
  6. (* Autor:               Dirk Steins                             *)
  7. (* erstellt am:         15.2.93                                 *)
  8. (* letzte Žnderung am:  16.02.93                                *)
  9. (* Version:             0.11                                    *)
  10. (* Interne Version:     V#002                                   *)
  11. (* Kommentar:           Datenbankkonvertierer und Installations-*)
  12. (*                      programm zu CAT 2.0                     *)
  13.  
  14.  
  15. (*==============================================================*)
  16. (* Datum    Version     Žnderung                                *)
  17. (*==============================================================*)
  18. (*                                                              *)
  19. (* 15.2.93  0.1         Modul erstellt aus CatPutz, Konvert     *)
  20. (*                      der Database geht. Es fehlt noch die    *)
  21. (*                      Konvertierung der Zusatzdateien.        *)
  22. (* 16.2.93  0.11        Konvertierung der GRUPPEN.POS eingebaut *)
  23. (*                                                              *)
  24. (*                                                              *)
  25. (*==============================================================*)
  26.  
  27.  
  28. FROM SYSTEM IMPORT ADDRESS, ADR, CADR, TSIZE, BYTE, ASSEMBLER, CALLSYS;
  29.  
  30. FROM MagicAES   IMPORT
  31.      AESIntIn, AESAddrIn, AESIntOut,
  32.      OBJECT, DISABLED, SELECTED, HIDETREE,
  33.      GBUTTON, GSTRING,
  34.      RED, MAGENTA, BLACK,
  35.      MenuBar, MenuTnormal, MenuIenable,
  36.      ShelEnvrn, FormAlert,
  37.      EvntPmulti, EvntTimer, ObjcDraw,
  38.      MNSELECTED, MUKEYBD, MUMESAG,
  39.      KRSHIFT, KLSHIFT, KCTRL, KALT,
  40.      WindUpdate, FormDial,
  41.      ENDUPDATE, BEGUPDATE, FMDFINISH;
  42.      
  43. FROM MagicSys   IMPORT sBITSET, CastToInt, CastToBitset, Basepage;
  44.  
  45. FROM MagicXBIOS IMPORT Keytbl, Keycode, KEYTAB, PtrKEYTAB;
  46.  
  47. FROM MagicDOS    IMPORT Malloc, Mfree, Minus1;
  48.  
  49. FROM MagicTypes  IMPORT PtrPD;
  50.      
  51.         (* magic tools *)
  52. FROM mtAppl     IMPORT
  53.      ApplInit, ApplTerm, ApplIdent, VDIHandle, MaxWidth, MaxHeight,
  54.      MouseArrow, ApplPath;
  55.      
  56. FROM mtDir      IMPORT  GetDir;
  57.  
  58. IMPORT MagicDOS, MagicAES;
  59.      
  60. (* mos *)
  61. FROM Storage            IMPORT ALLOCATE, DEALLOCATE, Inconsistent;
  62.  
  63. FROM MOSGlobals         IMPORT PathStr, NameStr, FileStr;
  64.  
  65. FROM Lists      IMPORT  List,           CreateList,     DeleteList,
  66.                         AppendEntry,    ListEmpty,      CurrentEntry,
  67.                         NextEntry,      ResetList,      RemoveEntry,
  68.                         ScanEntries,    LDir,           LCondProc,
  69.                         NoOfEntries,    PrevEntry;
  70.  
  71. FROM TimeConvert IMPORT DateToText, TimeToText;
  72.  
  73. FROM Clock      IMPORT CurrentTime, CurrentDate;
  74. (* strings *)
  75.  
  76. FROM Strings            IMPORT  String, Copy, Append, Empty, Space, Concat,
  77.                                 Assign, Length, Relation, Insert, Pos, StrEqual;
  78.  
  79. FROM FuncStrings        IMPORT  ConcStr;
  80.  
  81. FROM StrConv            IMPORT  LNumToStr, NumToStr, StrToCard, CardToStr;
  82.  
  83. IMPORT FastStrings, Block;
  84.  
  85. (* Disk I/O *)
  86.  
  87. FROM Directory          IMPORT  GetDefaultPath, SetDefaultPath, Delete, Rename;
  88.  
  89. FROM FileNames          IMPORT  ValidatePath, SplitPath, FileName;
  90.  
  91. IMPORT Files, Binary, Text;
  92.  
  93.         (* eigene Module *)
  94. FROM InstRsc    IMPORT
  95.      PtrObjTree, deskSize, menu, version, xVersion,
  96.      InitResource, doInfo, 
  97.      ClrRsrc, GetAndCreatePath, doConfig;
  98.      
  99. IMPORT Inst_30;
  100.  
  101. IMPORT Mintbind;
  102.  
  103. (* CAT-Module: *)
  104.  
  105. FROM Void   IMPORT v;
  106.  
  107. FROM GrafBase IMPORT Rectangle;
  108.  
  109. IMPORT CatFiles, dataSys;
  110.  
  111.  
  112.   CONST  whatText  = '@(#) CAT-Install 3.0 V1.02 (c) 1996 Dirk Steins'+0c;
  113.  
  114.  
  115.   CONST alt1    = "[3][Kann CAT30.DAT|nicht kopieren!][Abbruch]";  
  116.         alt2    = "[3][Fehler beim Auspacken|von CAT30.ZFX!][Abbruch]";
  117.         alt3    = "[3][Konnte CAT.INF nicht schliežen][OK]";
  118.         alt4    = "[2][Install:|Willst Du CAT komplett neu|installieren oder ein Update|von CAT 2.x auf CAT 3.0|durchfhren?][Neu|Update|Abbruch]";
  119.         alt5    = "[1][Install:|Ohne Installationspfad|kann ich auch nix installieren!][Ach?!]";
  120.         alt6    = "[1][Install:|Die Installation wurde|erfolgreich durchgefhrt!][Hurra!]";
  121.         
  122.         newCat      = TRUE;
  123.   
  124.   TYPE  MaxStr    = ARRAY [0..255] OF CHAR;
  125.         PtrMaxStr = POINTER TO MaxStr;
  126.         
  127.   VAR 
  128.       newCatPath,
  129.       dataBasePath,
  130.       messagePath,
  131.       targetPath,
  132.       applpath        : FileStr;
  133.       
  134.       voidO     : BOOLEAN;
  135.       voidC     : CARDINAL;
  136.       voidI     : INTEGER;
  137.       
  138.  
  139. PROCEDURE selectFile (REF title : ARRAY OF CHAR;
  140.                       REF mask  : ARRAY OF CHAR;
  141.                       VAR fName : ARRAY OF CHAR) : BOOLEAN;
  142.   VAR void128 : PathStr;
  143.       name    : NameStr;
  144.       success : BOOLEAN;
  145. BEGIN
  146.   GetDefaultPath(targetPath);
  147.   IF ~Empty (mask)
  148.   THEN
  149.     Append (mask, targetPath, voidO);
  150.   ELSE
  151.     Append ('*.*', targetPath, voidO);
  152.   END;
  153.   void128 := 0c;
  154.   name := 0c;
  155.   success := GetDir (targetPath, name, title);
  156.   IF ~success THEN RETURN FALSE END;
  157.   SplitPath(targetPath, targetPath, void128);
  158.   ValidatePath (targetPath);
  159.   SetDefaultPath (targetPath, voidI);
  160.   Assign (ConcStr (targetPath, name), fName, voidO);
  161.   RETURN TRUE
  162. END selectFile;
  163.  
  164. PROCEDURE getFile (REF title : ARRAY OF CHAR;
  165.                    VAR f : Files.File;
  166.                    REF mask :ARRAY OF CHAR;
  167.                    mode : Files.Access) : BOOLEAN;
  168.   VAR fname   : String;
  169. BEGIN
  170.   MouseArrow;
  171.   IF selectFile (title, mask, fname)
  172.   THEN
  173.     Files.Open (f, fname, mode);
  174.     IF Files.State(f) < 0 THEN Files.ResetState (f); RETURN FALSE END;
  175.     RETURN TRUE
  176.   END;
  177.   RETURN FALSE
  178. END getFile;
  179.  
  180. PROCEDURE ConvMsgInfo();
  181. CONST   msgInfoName = 'MSGINFO.DAT'+0C;
  182.  
  183.         (* Magics fr Header *)
  184.         msgCatMagic     = 4341544DH;  (* "CATM"                    *)
  185.         msgVersion      = 2;          (* Versionsnummer der MsgManager.i *)
  186.         oldVersionMagic = 0150H;      (* altes Versionsmagic             *)
  187.         msgVersionMagic = 0160H;      (* Versionsmagic                   *)
  188.  
  189. TYPE
  190.         shortInfo = RECORD 
  191.                       msgType     : CARDINAL;
  192.                       number      : INTEGER;
  193.                       copyCount   : INTEGER;
  194.                       refNum      : INTEGER;
  195.                       sendMsg     : BOOLEAN;
  196.                       toDelete    : BOOLEAN;
  197.                       dist        : CARDINAL;
  198.                       size        : LONGCARD;
  199.                       noRefLine   : BOOLEAN;
  200.                       cDate       : CARDINAL;
  201.                       cTime       : CARDINAL;
  202.                       (* Ab hier neu *)
  203.                       orgDist     : CARDINAL;
  204.                       reserved1,
  205.                       reserved2   : LONGCARD; 
  206.                     END;
  207.  
  208.         diskArrayPtr = POINTER TO ARRAY [0..999] OF shortInfo;
  209.  
  210.  VAR    msgHdl  : INTEGER;
  211.         size    : LONGCARD;
  212.         mess    : CARDINAL;
  213.         shortArray : diskArrayPtr;
  214.         i       : CARDINAL;
  215.         dbHdr   : dataSys.FileHeaderType;
  216.         fname   : MaxStr;
  217. BEGIN
  218.   (* MSGINFO.DAT einlesen, und prfen *)
  219.   FastStrings.Assign (messagePath, fname);
  220.   FastStrings.Append (msgInfoName, fname);
  221.   msgHdl := MagicDOS.Fopen (fname, {MagicDOS.ReadWrite});
  222.   IF msgHdl < 0       (* File not found *)
  223.   THEN
  224.     (* Nichts zum konvertieren da *)
  225.     RETURN 
  226.   ELSE
  227.     CatFiles.Seek (0, msgHdl, CatFiles.end);
  228.     size := CatFiles.FilePos (msgHdl);
  229.     (* Erstmal den Header lesen und testen *)
  230.     CatFiles.Seek (0, msgHdl, CatFiles.start);
  231.  
  232.     (* Jetzt erst mal Header einlesen *)
  233.     CatFiles.Seek (0, msgHdl, CatFiles.start);
  234.     CatFiles.ReadMuch (dataSys.dbHeaderLength, msgHdl, ADR(dbHdr));
  235.     IF CatFiles.FileError # CatFiles.NoError
  236.     THEN
  237.       CatFiles.CloseFile (msgHdl);
  238.       RETURN
  239.     END;
  240.     (* Jetzt berprfen des Headers *)
  241.     IF (dbHdr.CatMagic # msgCatMagic)
  242.     OR (dbHdr.Version  # msgVersion)
  243.     OR (dbHdr.VersionMagic # oldVersionMagic)
  244.     THEN
  245.       (* Entweder falsche oder nicht die alte Version,
  246.        * nichts konvertieren
  247.        *)
  248.       CatFiles.CloseFile (msgHdl);
  249.       RETURN
  250.     END;
  251.     
  252.     mess := SHORT((size - dataSys.dbHeaderLength) DIV (TSIZE (shortInfo) - 10));
  253.     ALLOCATE (shortArray, mess * TSIZE (shortInfo));
  254.     IF shortArray = NIL THEN CatFiles.CloseFile (msgHdl); RETURN END;
  255.     Block.Clear (shortArray, mess*TSIZE (shortInfo));
  256.     (* Jetzt jedes Info einzeln einlesen und an die richtige Stelle setzen
  257.      *)
  258.     FOR i := 0 TO mess - 1 DO
  259.       CatFiles.ReadMuch (TSIZE (shortInfo)-10, msgHdl, ADR(shortArray^[i]));
  260.     END;
  261.     (* Und jetzt den ganzen Kram mit neuer Versionsnummer rausschreiben *)
  262.     dbHdr.CatMagic := msgCatMagic;
  263.     dbHdr.Version  := msgVersion;
  264.     dbHdr.VersionMagic := msgVersionMagic;
  265.     CatFiles.Seek (0, msgHdl, CatFiles.start);
  266.     CatFiles.WriteMuch (dataSys.dbHeaderLength, msgHdl, ADR(dbHdr));
  267.     CatFiles.WriteMuch (LONG(mess) * TSIZE (shortInfo), msgHdl, shortArray);
  268.     DEALLOCATE (shortArray, 0);
  269.     CatFiles.CloseFile (msgHdl);
  270.   END;    
  271. END ConvMsgInfo;
  272.  
  273. PROCEDURE MemAvail () : LONGCARD;
  274. BEGIN
  275.   RETURN LONGCARD(Malloc (Minus1));
  276. END MemAvail;
  277.  
  278. PROCEDURE copy (REF from, to : ARRAY OF CHAR; move: BOOLEAN; VAR res :INTEGER);
  279.   VAR s, d : Files.File;
  280.       mbuf : ADDRESS;
  281.       slen : LONGCARD;
  282.       blen : LONGCARD;
  283.       pos  : LONGCARD;
  284.       readB: LONGCARD;
  285.  
  286.   PROCEDURE closeIt();
  287.   BEGIN
  288.     voidO := Mfree (mbuf);
  289.     Files.Close (d);
  290.     Files.Close (s);
  291.   END closeIt;
  292.   
  293. BEGIN
  294.   Files.Open (s, from, Files.readOnly);
  295.   IF Files.State(s) < 0
  296.   THEN
  297.     res := -1;
  298.     RETURN;
  299.   END;
  300.   Files.Create (d, to, Files.writeOnly, Files.replaceOld);
  301.   IF Files.State(d) < 0
  302.   THEN
  303.     res := -1;
  304.     RETURN;
  305.   END;
  306.   slen := Binary.FileSize (s);
  307.   blen := MemAvail();
  308.   IF blen < 12000 THEN res := -39; RETURN END;
  309.   blen := blen - 8192;
  310.   mbuf := Malloc ( blen);
  311.   IF mbuf = NIL THEN RETURN END;
  312.   pos := 0L;
  313.   WHILE pos + blen <= slen DO
  314.     Binary.ReadBytes (s, mbuf, blen, readB);
  315.     Binary.WriteBytes (d, mbuf, blen);
  316.     INC (pos, blen);
  317.   END;
  318.   IF pos < slen THEN
  319.     Binary.ReadBytes (s, mbuf, slen-pos, readB);
  320.     Binary.WriteBytes (d, mbuf, slen-pos);
  321.   END;
  322.   closeIt;
  323.   res := 0;
  324.   IF move THEN Delete (from, res); END;
  325. END copy;
  326.  
  327. PROCEDURE ExtractArchive(): BOOLEAN;
  328.   CONST arcName = 'CAT30.DAT';
  329.         expName = 'CAT30.ZFX';
  330.         clrStr  = 33c+'E'+0c;
  331.   VAR cmd, oName, nName : FileStr;
  332.       res          : INTEGER;
  333. BEGIN
  334.   FastStrings.Assign (applpath, oName);
  335.   FastStrings.Append (arcName, oName);
  336.   FastStrings.Assign (newCatPath, nName);
  337.   FastStrings.Append (expName, nName);
  338.   IF StrEqual (applpath, newCatPath)
  339.   THEN
  340.     Rename (oName, nName, res);
  341.   ELSE
  342.     copy (oName, nName, FALSE, res);
  343.   END;
  344.   IF res # 0 THEN 
  345.     v.int := MagicAES.FormAlert (1, alt1); 
  346.     RETURN FALSE 
  347.   END;
  348.   (* Auf executable setzen fr MiNT *)
  349.   v.lint := Mintbind.Fchmod (nName, BITSET(0777H));
  350.   cmd[0] := 0c;
  351.   SetDefaultPath (newCatPath, voidI);
  352.   MagicDOS.Cconws (clrStr);
  353.   res := MagicDOS.Pexec(MagicDOS.LoadnGo, nName, cmd, cmd);
  354.   IF res # 0 THEN 
  355.     v.int := MagicAES.FormAlert (1, alt2); 
  356.     RETURN FALSE 
  357.   END;
  358.   Delete (nName, res);
  359.   RETURN TRUE;
  360. END ExtractArchive;
  361.  
  362. CONST RscName = "INST_30.RSC";
  363.  
  364. PROCEDURE readCatInf (f : Files.File): BOOLEAN;
  365.   VAR i : INTEGER;
  366. BEGIN
  367.   FOR i := 1 TO 7 DO
  368.     Text.ReadLn (f);
  369.   END;
  370.   Text.ReadString (f, messagePath);
  371.   Text.ReadLn (f);
  372.   Text.ReadLn (f);
  373.   Text.ReadLn (f);
  374.   Text.ReadString (f, dataBasePath);
  375.   Files.Close (f);
  376.   IF Files.State (f) # 0 THEN i := MagicAES.FormAlert (1, alt3); END;
  377.   SetDefaultPath (dataBasePath, voidI);
  378.   MouseArrow();
  379.   RETURN TRUE
  380. END readCatInf;
  381.  
  382. PROCEDURE readNewInf (): BOOLEAN;
  383.   VAR f : Files.File;
  384.       oldDir: MaxStr;
  385. BEGIN
  386.  Assign (newCatPath, oldDir, voidO);
  387.  IF ~getFile ('CAT.INF laden',f,'*.INF',Files.readSeqTxt)
  388.  THEN
  389.    RETURN FALSE
  390.  END;
  391.  (* Gruppenliste l”schen *)
  392.  IF ~readCatInf (f)
  393.  THEN
  394.    RETURN FALSE
  395.  END;
  396.  RETURN TRUE;
  397. END readNewInf;
  398.  
  399. PROCEDURE init(): BOOLEAN;
  400. (* Lesen von CAT.INF
  401.  * Zeile 11:    Database-Pfad
  402.  *)
  403.  VAR rscName : String;
  404. BEGIN
  405.   rscName := RscName;
  406.   IF InitResource (rscName)
  407.   THEN
  408.     RETURN TRUE
  409.   ELSE
  410.     RETURN FALSE
  411.   END;
  412. END init;
  413.  
  414. VAR gruFile : Files.File;
  415.  
  416. VAR msgBuf : ARRAY [0..15] OF INTEGER;
  417.     ende : BOOLEAN;
  418.     but  : CARDINAL;
  419.     event : sBITSET;
  420.  
  421. (*-------------- Menu Handling -----------------------------*)
  422.  
  423. VAR quitProg : BOOLEAN;
  424.  
  425. PROCEDURE menuManager (item, menuIndex : CARDINAL; kstate : BITSET);
  426.   VAR res : INTEGER;
  427.       instNew : BOOLEAN;
  428.       name    : NameStr;
  429.       path    : FileStr;
  430.       r       : Rectangle;
  431. BEGIN
  432.   CASE item OF
  433.     Fminsta  : (* Erstmal erfragen, ob CAT neu installiert werden soll
  434.                 * oder ob eine alte Datenbank bernommen werden soll
  435.                 *)
  436.                res := MagicAES.FormAlert (1, alt4);
  437.                IF res = 3 THEN 
  438.                  MenuTnormal (menu, menuIndex, 1);
  439.                  RETURN
  440.                END;
  441.                instNew := res = 1;
  442.                (* Jetzt den Installationspfad rausfinden *)
  443.                FastStrings.Assign (applpath, path);
  444.                
  445.                IF ~GetAndCreatePath (path, name, 'Installationspfad')
  446.                THEN
  447.                  res := MagicAES.FormAlert (1, alt5);
  448.                  MenuTnormal (menu, menuIndex, 1); 
  449.                  RETURN
  450.                END;
  451.                (* Pfad ist nun vorhanden und steht in path *)
  452.                FastStrings.Assign (path, newCatPath);
  453.                
  454.                IF ~instNew
  455.                THEN
  456.                  (* Jetzt erst CAT.INF lesen *)
  457.                  IF ~readNewInf()
  458.                  THEN
  459.                    MenuTnormal (menu, menuIndex, 1);
  460.                    RETURN
  461.                  END;
  462.                END;
  463.                  
  464.                (* So, jetzt erstmal CAT auspacken lassen *)
  465.                IF ~ExtractArchive()
  466.                THEN
  467.                  MenuTnormal (menu, menuIndex, 1); 
  468.                  RETURN
  469.                ELSE
  470.                  (* Redraw ber gesamten Screen ausl”sen *)
  471.                  WITH r DO
  472.                    x := 0; y := 0; w := MaxWidth; h := MaxHeight;
  473.                  END;
  474.                  FormDial(FMDFINISH, r, r);
  475.                  v.int := MenuBar(menu, MagicAES.Set);
  476.                  WindUpdate (ENDUPDATE);
  477.                  EvntTimer (100);
  478.                  WindUpdate (BEGUPDATE);
  479.                  
  480.                END;
  481.  
  482.                (* Wenn nur installiert werden soll, dann sind wir fast fertig! *)
  483.                IF instNew
  484.                THEN
  485.                  doConfig (newCatPath, dataBasePath); (* CAT.INF erstellen *)
  486.                ELSE
  487.                  (* MsgInfo.DAT konvertieren *)
  488.                  ConvMsgInfo();
  489.                END;
  490.                  
  491.                voidI := MagicAES.FormAlert (1, alt6);
  492.                |
  493.     Fmquit   : MenuTnormal (menu, menuIndex, 1); quitProg := TRUE; |
  494.     Aboutobj : doInfo(); |
  495.   ELSE
  496.   END;
  497.   MenuTnormal (menu, menuIndex, 1);
  498. END menuManager;
  499.  
  500. PROCEDURE setMultiParam();
  501. BEGIN
  502.   AESIntIn[0] := CastToInt (sBITSET{MUMESAG});
  503.   AESAddrIn[0] := ADR (msgBuf);
  504. END setMultiParam;
  505.  
  506. VAR scan : CHAR;
  507.     key  : CHAR;
  508.     kstate : sBITSET;
  509.     keyscan : INTEGER;
  510.  
  511. CONST AP_TERM = 50;
  512.  
  513. PROCEDURE getMultiResult();
  514. BEGIN
  515.   kstate := CastToBitset(AESIntOut[4]);
  516.   keyscan := AESIntOut[5];
  517.   (* Das auseinanderpflcken der einzeilnen Bytes geht in Assembler
  518.    * einfacher als in M2
  519.    *)
  520.   ASSEMBLER
  521.     MOVE.W      keyscan,D0      ; kreturn (ASCII und Scan)
  522.     MOVE.B      D0,key          ; Ascii nach key (Bits 0..7)
  523.     LSR.W       #8,D0           ; D0 rotieren
  524.     MOVE.B      D0,scan         ; Scancode holen (Bits 8..15)
  525.   END;
  526. END getMultiResult;
  527.  
  528.  
  529. BEGIN
  530.   dataBasePath := whatText;     (* gegen optimierenden Linker *)
  531.   ApplPath (applpath);
  532.   IF ~init() THEN RETURN END;
  533.   MouseArrow;
  534.   voidI := MenuBar (menu, 1);
  535.   quitProg := FALSE;
  536.   LOOP
  537.     setMultiParam();
  538.     event := EvntPmulti ();
  539.     getMultiResult();
  540.     WindUpdate (BEGUPDATE);
  541.     IF MUMESAG IN event
  542.     THEN
  543.       CASE msgBuf[0] OF
  544.         MNSELECTED : menuManager (msgBuf[4], msgBuf[3], kstate); 
  545.                      MouseArrow(); |
  546.         AP_TERM    : quitProg := TRUE; |
  547.       ELSE
  548.       END
  549.     END;
  550.     WindUpdate (ENDUPDATE);
  551.     IF quitProg THEN EXIT END;
  552.   END;
  553.   ClrRsrc();
  554.   ApplTerm(0);
  555. END Inst30.
  556.